#include "SymboleValue.h"
#include <stdlib.h>
#include <typeinfo>

////////////////////////////////////////////////////////////////////////////////
SymboleValue::SymboleValue(Symbole s) :
Symbole(s.getChaine()) {
    if (s == "<ENTIER>") {
        valeur = new ValeurEntiere(atoi(s.getChaine().c_str())); // c_str convertit une string en char*
        defini = true;
    }
    else if (s == "<FLOTTANT>"){                
        valeur = new ValeurFlottant(atof(s.getChaine().c_str()));        
        defini = true;
    }  
    else if (s == "<CHAINE>"){
        valeur = new ValeurChaine(s.getChaine());
        defini = true;
    }
     else {    
        defini = false;
    }
}

////////////////////////////////////////////////////////////////////////////////

void SymboleValue::afficher(unsigned short indentation) {
    Noeud::afficher(indentation);
    cout << "Feuille - Symbole value : " << getChaine() << endl; // on affiche la chaine du symbole
}

////////////////////////////////////////////////////////////////////////////////

void SymboleValue::afficherAda() {
    Noeud::afficherAda();
    cout << getChaine();
}

////////////////////////////////////////////////////////////////////////////////
// Attention : cette fonction (operator) n'est pas membre de la classe SymboleValue

ostream & operator <<(ostream & cout, SymboleValue symb) {
    cout << (Symbole) symb << "\t\t - Valeur=";
    if (symb.defini){        
        if(typeid(*symb.valeur)==typeid(ValeurEntiere))            
               cout << ((ValeurEntiere*)(symb.valeur))->getValeur() << " ";
        else if(typeid(*symb.valeur)==typeid(ValeurChaine))
            cout << ((ValeurChaine*)(symb.valeur))->getValeur() << " ";    
        else if(typeid(*symb.valeur)==typeid(ValeurFlottant))
            cout << ((ValeurFlottant*)(symb.valeur))->getValeur() << " ";
    }
    else
        cout << "indefinie ";
    return cout;
}
